package Prototype;

/**
 * @Author: Cjj
 * 桥接模式
 *  是用于把抽象化与实现化解耦，使得二者可以独立变化。
 *  这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构，来实现二者的解耦
 *  这种模式涉及到一个作为桥接的接口，使得实体类的功能独立接口实现类,这两种类型的类可被结构化改变而互不影响。
 *  桥接模式的目的是将抽象与实现分离，使得它们可以独立地变化。
 *  主要解决的问题：
 *    避免使用继承导致的类爆炸问题，提供更灵活的扩展方式
 *  使用场景
 *    当系统可能从多个角度进行分类，且每个角度都可能独立变化时，桥接模式是合适的
 *  实现方式
 *   分离多角度分类：将不同角度的分类逻辑分离,允许它们独立变化。
 *   减少耦合降低抽象与实现之间的耦合度
 *  优点：
 *   抽象与实现分离：提高了系统的灵活性和可维护性
 *   扩展能力强；可以独立地扩展抽象和实现。
 *   实现细节透明：用户不需要了解实现细节
 *  缺点：
 *   理解与设计难度：桥接模式增加了系统的理解与设计难度
 *   聚合关联：要求开发者在抽象层进行设计与编程
 */
public interface DrawAPI {

    /**
     * 抽象(Abstraction): 定义抽象接口,通常包含对实现接口的引用。
     * 扩展抽象(Refined Abstraction): 对抽象的扩展,可以是抽象类的子类或具体实现类
     * 实现(Implementor): 定义实现接口,提供基本操作的接口。
     * 具体实现(Concrete Implementor): 实现实现接口,提供基本操作的具体实现。
     */
    public void drawCircle(int radius, int x, int y);

    public class RedCircle implements DrawAPI {
        @Override
        public void drawCircle(int radius, int x, int y) {
            System.out.println("Drawing Circle[ color: red, radius: "
                    + radius + ", x: " + x + ", " + y + "]");
        }

        public class GreenCircle implements DrawAPI {
            @Override
            public void drawCircle(int radius, int x, int y) {
                System.out.println("Drawing Circle[ color: green, radius: "
                        + radius + ", x: " + x + ", " + y + "]");
            }
        }

        public abstract class Shape {
            protected DrawAPI drawAPI;
            protected Shape(DrawAPI drawAPI){
                this.drawAPI = drawAPI;
            }
            abstract void draw();
        }
    }

    public class Circle extends Shape {
        private int x, y, radius;

        public Circle(int x, int y, int radius) {
            this.x = x;
            this.y = y;
            this.radius = radius;
        }
        @Override
        void draw() {

        }
    }
}
